package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Seccion;
import modelo.servicio.Areas;
import modelo.servicio.Historicos;
import modelo.servicio.Secciones;

public class SeccionDAO { //extends AbstractDAO<Seccion> {

    private String query;

    public void add(Seccion entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            /*
             * PROCEDURE [dbo].[SSMA_ALTER_SECCION_P] @ACCION varchar(1),
             * @USUARIO varchar(25), @ID_SECCION int, @NOMBRE varchar(150),
             * @ABREVIACION varchar(150), @ID_AREA int, @PADRE int, @ESTADO
             * VARCHAR(2)
             */
            query = "EXEC SSMA_ALTER_SECCION_P ";
            query += "'I'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", 0";
            query += ", '" + entity.getNombre().replace("'", "''").replace("'", "''") + "'";
            query += ", '" + entity.getAbreviacion().replace("'", "''").replace("'", "''") + "'";
            query += ", " + entity.getArea().getIdArea();
            //query += ", '" + entity.getTipo() + "'";
            query += ", " + (entity.getPadre() == null ? null : entity.getPadre().getIdSeccion());
            query += ", 'CR'";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 SEDA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 SEDA-SQL " + ex.getMessage());
            }
        }
    }

    public void deleteWhere(String condition) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "UPDATE SSMA_HISTORICO_T SET ESTADO = 'IN' WHERE ID_HISTORICO IN ";
            query += " (SELECT ID_HISTORICO FROM SSMA_SECCIONES_T WHERE " + condition + ")";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 SEDD-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 SEDD-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Seccion entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            /*
             * PROCEDURE SSMA_ALTER_SECCION_P --ARGUMENTOS POR DEFECTO @ACCION
             * VARCHAR(1), @USUARIO VARCHAR(25), --ARGUMENTOS DE LA TABLA
             * @ID_SECCION INT, @NOMBRE VARCHAR(150), @DESCRIPCION VARCHAR(150),
             * @ID_AREA INT, @TIPO VARCHAR(1), @PADRE INT
             */
            query = "EXEC SSMA_ALTER_SECCION_P ";
            query += "'U'";
            query += ", '" + entity.getHistorico().getUsuarioMod().replace("'", "''") + "'";
            query += ", " + entity.getIdSeccion();
            query += ", '" + entity.getNombre().replace("'", "''") + "'";
            query += ", '" + entity.getAbreviacion().replace("'", "''") + "'";
            query += ", " + entity.getArea().getIdArea();
            //query += ", '" + entity.getTipo() + "'";
            query += ", " + (entity.getPadre() == null ? null : entity.getPadre().getIdSeccion());
            query += ", '" + entity.getHistorico().getEstado().replace("'", "''") + "'";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 SEDU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("3 SEDU-SQL " + ex.getMessage());
            }
        }
    }

    protected synchronized List<Seccion> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Seccion> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Seccion>();
            boolean si = conexion.getAutoCommit();
            while (resultado.next()) {
                Seccion seccion = new Seccion();
                seccion.setIdSeccion(resultado.getInt("ID_SECCION"));
                seccion.setNombre(resultado.getString("NOMBRE"));
                seccion.setAbreviacion(resultado.getString("ABREVIACION"));
                seccion.setArea(Areas.instancia().obtenerPorId(resultado.getInt("ID_AREA")));
                seccion.setHistorico(Historicos.instancia().obtenerPorId(resultado.getInt("ID_HISTORICO")));
                if (resultado.getString("PADRE") != null) {
                    //int padre = resultado.getInt("PADRE") == 0 ? 0 : resultado.getInt("PADRE");
                    seccion.setPadre(Secciones.instancia().obtenerPorId(resultado.getInt("PADRE")));
                }
                resultados.add(seccion);
            }
        } catch (SQLException ex) {
            throw new DAOException("1 SEDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 SEDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Seccion> selectAll() throws DAOException {
        query = "SELECT ID_SECCION\n"
                + "      ,NOMBRE\n"
                + "      ,ABREVIACION\n"
                + "      ,ID_AREA\n"
                + "      ,PADRE\n"
                + "      ,ID_HISTORICO "
                + "FROM SSMA_SECCIONES_T "
                + " WHERE ID_HISTORICO NOT IN "
                + " (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN') "
                + " ORDER BY PADRE";
        return select();
    }

    public List<Seccion> selectWhere(String condition) throws DAOException {
        query = "SELECT ID_SECCION\n"
                + "      ,NOMBRE\n"
                + "      ,ABREVIACION\n"
                + "      ,ID_AREA\n"
                + "      ,PADRE\n"
                + "      ,ID_HISTORICO "
                + "FROM SSMA_SECCIONES_T WHERE (" + condition + ")";
        query += " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public synchronized int selectCount(Integer area) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        ResultSet resultado = null;
        int contador = 0;
        try {
            query = "SELECT COUNT(1) AS CUENTA "
                    + "FROM SSMA_SECCIONES_T "
                    + "WHERE ID_AREA = " + area
                    + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO "
                    + "                         FROM SSMA_HISTORICO_T "
                    + "                         WHERE ESTADO = 'IN')";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            boolean si = conexion.getAutoCommit();
            if (resultado.next()) {
                contador = resultado.getInt("CUENTA");
            } else {
                contador = 0;
            }
        } catch (SQLException ex) {
            throw new DAOException("3 SEDC-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("4 SEDC-SQL " + ex.getMessage());
            }
        }
        return contador;
    }

    public synchronized List<Seccion> selectPag(int desde, int hasta, Integer area) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        ResultSet resultado = null;
        List<Seccion> resultados = null;
        try {
            query = "SELECT ID_SECCION\n"
                    + "      ,NOMBRE\n"
                    + "      ,ABREVIACION\n"
                    + "      ,ID_AREA\n"
                    + "      ,PADRE\n"
                    + "      ,ID_HISTORICO "
                    + "FROM ("
                    + " SELECT ROW_NUMBER()"
                    + " OVER(ORDER BY PADRE) AS LINEA,"
                    + " SST.*"
                    + " FROM SSMA_SECCIONES_T SST"
                    + " WHERE ID_AREA = " + area
                    + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')"
                    + ") A"
                    + " WHERE A.LINEA BETWEEN " + desde
                    + " AND " + hasta;
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Seccion>();
            while (resultado.next()) {
                Seccion seccion = new Seccion();
                seccion.setIdSeccion(resultado.getInt("ID_SECCION"));
                seccion.setNombre(resultado.getString("NOMBRE"));
                seccion.setAbreviacion(resultado.getString("ABREVIACION"));
                if (resultado.getString("PADRE") != null) {
                    seccion.setPadre(Secciones.instancia().obtenerPorId(resultado.getInt("PADRE")));
                }
                resultados.add(seccion);
            }
            boolean si = conexion.getAutoCommit();
        } catch (SQLException ex) {
            throw new DAOException("5 SEDP-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("6 SEDP-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }
}
